Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


LXST/Sinks.py 628ef907a8a1c32dd5f0c2bd186f480b5e46bab4 (628ef907) Text, 16.38 KB

T8b949e# Copyright 2024-2026, Mark Qvist

Tff7b72import T7ee787RNS
Tff7b72import T7ee787math
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787LXSTT7ee787.T7ee787Codecs Tff7b72import Te6edf3Opus
Tff7b72from T7ee787LXSTT7ee787.T7ee787CodecsT7ee787.T7ee787Codec Tff7b72import Te6edf3resample_bytesTb4b4b4, Te6edf3resample

Tff7b72class T56d364LinuxBackendTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3SAMPLERATE Tff7b72= T79c0ff48000

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3preferred_deviceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3samplerateTff7b72=Te6edf3SAMPLERATETb4b4b4)Tb4b4b4:
Tff7b72from T7ee787.T7ee787PlatformsT7ee787.T7ee787linux Tff7b72import Te6edf3soundcard
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3samplerate
Tff7b72selfTff7b72.Td2a8ffsoundcard Tff7b72= Te6edf3soundcard
Tff7b72if Te6edf3preferred_deviceTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffget_speakerTb4b4b4(Te6edf3preferred_deviceTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUsing output device Tffd700{Tff7b72selfTff7b72.Td2a8ffdeviceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffall_speakersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffall_speakersTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdefault_speakerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffflushTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_playerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samples_per_frameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffplayerTb4b4b4(Te6edf3samplerateTff7b72=Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4, Te6edf3blocksizeTff7b72=Te6edf3samples_per_frameTb4b4b4)

Tff7b72def Td2a8ffrelease_playerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72pass

Tff7b72class T56d364AndroidBackendTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3SAMPLERATE Tff7b72= T79c0ff48000

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3preferred_deviceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3samplerateTff7b72=Te6edf3SAMPLERATETb4b4b4)Tb4b4b4:
Tff7b72from T7ee787.T7ee787PlatformsT7ee787.T7ee787android Tff7b72import Te6edf3soundcard
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3samplerate
Tff7b72selfTff7b72.Td2a8ffsoundcard Tff7b72= Te6edf3soundcard
Tff7b72if Te6edf3preferred_deviceTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffget_speakerTb4b4b4(Te6edf3preferred_deviceTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUsing output device Tffd700{Tff7b72selfTff7b72.Td2a8ffdeviceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffall_speakersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffall_speakersTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdefault_speakerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffflushTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_playerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samples_per_frameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffplayerTb4b4b4(Te6edf3samplerateTff7b72=Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4, Te6edf3blocksizeTff7b72=Te6edf3samples_per_frameTb4b4b4, Te6edf3low_latencyTff7b72=Te6edf3low_latencyTb4b4b4)

Tff7b72def Td2a8ffrelease_playerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72pass

Tff7b72class T56d364DarwinBackendTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3SAMPLERATE Tff7b72= T79c0ff48000

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3preferred_deviceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3samplerateTff7b72=Te6edf3SAMPLERATETb4b4b4)Tb4b4b4:
Tff7b72from T7ee787.T7ee787PlatformsT7ee787.T7ee787darwin Tff7b72import Te6edf3soundcard
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3samplerate
Tff7b72selfTff7b72.Td2a8ffsoundcard Tff7b72= Te6edf3soundcard
Tff7b72if Te6edf3preferred_deviceTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffget_speakerTb4b4b4(Te6edf3preferred_deviceTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUsing output device Tffd700{Tff7b72selfTff7b72.Td2a8ffdeviceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffall_speakersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffall_speakersTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdefault_speakerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffflushTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_playerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samples_per_frameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffplayerTb4b4b4(Te6edf3samplerateTff7b72=Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4, Te6edf3blocksizeTff7b72=Te6edf3samples_per_frameTb4b4b4)

Tff7b72def Td2a8ffrelease_playerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72pass

Tff7b72class T56d364WindowsBackendTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3SAMPLERATE Tff7b72= T79c0ff48000

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3preferred_deviceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3samplerateTff7b72=Te6edf3SAMPLERATETb4b4b4)Tb4b4b4:
Tff7b72from T7ee787.T7ee787PlatformsT7ee787.T7ee787windows Tff7b72import Te6edf3soundcard
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3samplerate
Tff7b72selfTff7b72.Td2a8ffsoundcard Tff7b72= Te6edf3soundcard
Tff7b72if Te6edf3preferred_deviceTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffget_speakerTb4b4b4(Te6edf3preferred_deviceTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3soundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUsing output device Tffd700{Tff7b72selfTff7b72.Td2a8ffdeviceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffall_speakersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffall_speakersTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdefault_speakerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffflushTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_playerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samples_per_frameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffplayerTb4b4b4(Te6edf3samplerateTff7b72=Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4, Te6edf3blocksizeTff7b72=Te6edf3samples_per_frameTb4b4b4)

Tff7b72def Td2a8ffrelease_playerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72pass

Tff7b72def Td2a8ffget_backendTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_linuxTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3LinuxBackend
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3WindowsBackend
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_darwinTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3DarwinBackend
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3AndroidBackend
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None

Te6edf3Backend Tff7b72= Te6edf3get_backendTb4b4b4(Tb4b4b4)

Tff7b72class T56d364SinkTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3release_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffreleaseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrelease_lockTff7b72.Td2a8fflockedTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72with Tff7b72selfTff7b72.Td2a8ffrelease_lockTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffreleasedTa5d6ff"Tb4b4b4) Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ffreleasedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreleased Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffframe_deque Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffbackend Tff7b72= Tff7b72None

Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4: Tff7b72pass
Tff7b72def Td2a8ffcan_receiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72True

Tff7b72class T56d364RemoteSinkTb4b4b4(Te6edf3SinkTb4b4b4)Tb4b4b4: Tff7b72pass
Tff7b72class T56d364LocalSinkTb4b4b4(Te6edf3SinkTb4b4b4)Tb4b4b4: Tff7b72pass

Tff7b72class T56d364LineSinkTb4b4b4(Te6edf3LocalSinkTb4b4b4)Tb4b4b4:
Te6edf3MAX_FRAMES Tff7b72= T79c0ff6
Te6edf3AUTOSTART_MIN Tff7b72= T79c0ff1
Te6edf3FRAME_TIMEOUT Tff7b72= T79c0ff8

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3preferred_deviceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3autodigestTff7b72=Tff7b72TrueTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpreferred_device Tff7b72= Te6edf3preferred_device
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffdigest_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdigest_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinsert_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffframe_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Tff7b72selfTff7b72.Td2a8ffMAX_FRAMESTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffframe_timeout Tff7b72= Tff7b72selfTff7b72.Td2a8ffFRAME_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffautodigest Tff7b72= Te6edf3autodigest
Tff7b72selfTff7b72.Td2a8ffautostart_min Tff7b72= Tff7b72selfTff7b72.Td2a8ffAUTOSTART_MIN
Tff7b72selfTff7b72.Td2a8ffbuffer_max_height Tff7b72= Tff7b72selfTff7b72.Td2a8ffMAX_FRAMESTff7b72-T79c0ff3
Tff7b72selfTff7b72.Td2a8fflow_latency Tff7b72= Te6edf3low_latency
Tff7b72selfTff7b72.Td2a8ffpreferred_samplerate Tff7b72= Te6edf3BackendTff7b72.Td2a8ffSAMPLERATE
Tff7b72selfTff7b72.Td2a8ffbackend Tff7b72= Te6edf3BackendTb4b4b4(Te6edf3preferred_deviceTff7b72=Tff7b72selfTff7b72.Td2a8ffpreferred_deviceTb4b4b4, Te6edf3samplerateTff7b72=Tff7b72selfTff7b72.Td2a8ffpreferred_samplerateTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffsamplerate
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffchannels

Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffframe_time Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffoutput_latency Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffmax_latency Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff__wants_low_latency Tff7b72= Tff7b72False

Tff7b72def Td2a8ffcan_receiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffbuffer_max_heightTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframe_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72= Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffframe_time Tff7b72= Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTff7b72*Tb4b4b4(T79c0ff1Tff7b72/Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffsamplerateTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff starting at Tffd700{Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTffd700}Ta5d6ff samples per frame, Tffd700{Tff7b72selfTff7b72.Td2a8ffchannelsTffd700}Ta5d6ff channelsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffautodigest Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffautostart_minTb4b4b4: Tff7b72selfTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffdigest_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__digest_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdigest_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72def Td2a8ffenable_low_latencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__wants_low_latency Tff7b72= Tff7b72True

Tff7b72def Td2a8ff__digest_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffdigest_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_darwinTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3backend_samples_per_frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffsamples_per_frame
Tff7b72elseTb4b4b4: Te6edf3backend_samples_per_frame Tff7b72= Tff7b72None

Tff7b72with Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffget_playerTb4b4b4(Te6edf3samples_per_frameTff7b72=Te6edf3backend_samples_per_frameTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72selfTff7b72.Td2a8fflow_latencyTb4b4b4) Tff7b72as Te6edf3playerTb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3frames_ready Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4)
Tff7b72if Te6edf3frames_readyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutput_latency Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4)Tff7b72*Tff7b72selfTff7b72.Td2a8ffframe_time
Tff7b72selfTff7b72.Td2a8ffmax_latency Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuffer_max_heightTff7b72*Tff7b72selfTff7b72.Td2a8ffframe_time
Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72= Tff7b72None

Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4: Te6edf3frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72!= Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffchannelsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnderlying device for Tffd700{Tff7b72selfTffd700}Ta5d6ff re-configured channel map mid-stream (from Tffd700{Tff7b72selfTff7b72.Td2a8ffchannelsTffd700}Ta5d6ff to Tffd700{Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffchannelsTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffdeviceTff7b72.Td2a8ffchannels

Tff7b72if Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72> Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4: Te6edf3frame Tff7b72= Te6edf3frameTb4b4b4[Tb4b4b4:Tb4b4b4, T79c0ff0Tb4b4b4:Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]
Te6edf3playerTff7b72.Td2a8ffplayTb4b4b4(Te6edf3frameTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffbuffer_max_heightTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBuffer lag on Tffd700{Tff7b72selfTffd700}Ta5d6ff (height Tffd700{Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4)Tffd700}Ta5d6ff), dropping one frameTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffframe_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72== Tff7b72NoneTb4b4b4:
T8b949e# TODO: Remove debug
T8b949e# RNS.log(f"Buffer underrun on {self}", RNS.LOG_DEBUG)
Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffunderrun_atTff7b72+Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*Tff7b72selfTff7b72.Td2a8ffframe_timeoutTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo frames available on Tffd700{Tff7b72selfTffd700}Ta5d6ff, stopping playbackTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*T79c0ff0.1Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff__wants_low_latencyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__wants_low_latency Tff7b72= Tff7b72False
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3playerTb4b4b4, Ta5d6ff"Ta5d6ffenable_low_latencyTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Te6edf3playerTff7b72.Td2a8ffenable_low_latencyTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRun-time enabling low-latency mode on Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3playerTff7b72.Td2a8ffenable_low_latencyTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not run-time enable low latency mode on Tffd700{Tff7b72selfTffd700}Ta5d6ff, the operation is not supported by the backendTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffrelease_playerTb4b4b4(Tb4b4b4)

Tff7b72class T56d364OpusFileSinkTb4b4b4(Te6edf3LocalSinkTb4b4b4)Tb4b4b4:
Te6edf3MAX_FRAMES Tff7b72= T79c0ff64
Te6edf3AUTOSTART_MIN Tff7b72= T79c0ff1
Te6edf3FINALIZE_TIMEOUT Tff7b72= T79c0ff2
Te6edf3TYPE_MAP_FACTOR Tff7b72= Te6edf3npTff7b72.Td2a8ffiinfoTb4b4b4(Ta5d6ff"Ta5d6ffint16Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmax

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTff7b72=Tff7b72NoneTb4b4b4, Te6edf3autodigestTff7b72=Tff7b72TrueTb4b4b4, Te6edf3profileTff7b72=Te6edf3OpusTff7b72.Td2a8ffPROFILE_AUDIO_MAXTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffdigest_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdigest_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinsert_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffframe_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Tff7b72selfTff7b72.Td2a8ffMAX_FRAMESTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffautodigest Tff7b72= Te6edf3autodigest
Tff7b72selfTff7b72.Td2a8ffautostart_min Tff7b72= Tff7b72selfTff7b72.Td2a8ffAUTOSTART_MIN
Tff7b72selfTff7b72.Td2a8ffbuffer_max_height Tff7b72= Tff7b72selfTff7b72.Td2a8ffMAX_FRAMES
Tff7b72selfTff7b72.Td2a8ffprofile Tff7b72= Te6edf3profile
Tff7b72selfTff7b72.Td2a8ffbitdepth Tff7b72= T79c0ff32
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffoutput_samplerate Tff7b72= Te6edf3OpusTff7b72.Td2a8ffprofile_samplerateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprofileTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3OpusTff7b72.Td2a8ffprofile_channelsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprofileTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapplication Tff7b72= Te6edf3OpusTff7b72.Td2a8ffprofile_applicationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprofileTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbitrate_ceiling Tff7b72= Te6edf3OpusTff7b72.Td2a8ffprofile_bitrate_ceilingTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprofileTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmax_bytes_per_frame Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffframe_time Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffoutput_latency Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffmax_latency Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsamples_written Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff__recording_stopped Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff__finalized Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff__opus_writer Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__encoder Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__output_path Tff7b72= Te6edf3path

Tf0883e@property
Tff7b72def Td2a8ffframes_waitingTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4)

Tff7b72def Td2a8ffcan_receiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__recording_stoppedTb4b4b4: Tff7b72return Tff7b72False
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffbuffer_max_heightTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframe_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3sourceTff7b72.Td2a8ffsamplerate
Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72= Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffframe_time Tff7b72= Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTff7b72*Tb4b4b4(T79c0ff1Tff7b72/Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4: Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff starting at Tffd700{Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTffd700}Ta5d6ff samples per frame, Tffd700{Tff7b72selfTff7b72.Td2a8ffchannelsTffd700}Ta5d6ff channelsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffautodigest Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffautostart_minTb4b4b4: Tff7b72selfTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffdigest_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__digest_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdigest_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__recording_stopped Tff7b72= Tff7b72True
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Tff7b72selfTff7b72.Td2a8ffFINALIZE_TIMEOUT
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeoutTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72while Tff7b72selfTff7b72.Td2a8ff__finalized Tff7b72== Tff7b72FalseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__opus_writerTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__opus_writer Tff7b72= Tff7b72None

Tff7b72def Td2a8ff__digest_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffdigest_lockTb4b4b4:
Tff7b72from T7ee787.T7ee787CodecsT7ee787.T7ee787libsT7ee787.T7ee787pyogg Tff7b72import Te6edf3OpusBufferedEncoder
Tff7b72from T7ee787.T7ee787CodecsT7ee787.T7ee787libsT7ee787.T7ee787pyogg Tff7b72import Te6edf3OggOpusWriter
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__output_pathTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo recording file path configuredTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmax_bytes_per_frame Tff7b72= Te6edf3OpusTff7b72.Td2a8ffmax_bytes_per_frameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbitrate_ceilingTb4b4b4, Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*T79c0ff1000Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__encoder Tff7b72= Te6edf3OpusBufferedEncoderTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__encoderTff7b72.Td2a8ffset_applicationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapplicationTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__encoderTff7b72.Td2a8ffset_sampling_frequencyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__encoderTff7b72.Td2a8ffset_channelsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__encoderTff7b72.Td2a8ffset_frame_sizeTb4b4b4(Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*T79c0ff1000Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__encoderTff7b72.Td2a8ffset_max_bytes_per_frameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmax_bytes_per_frameTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__opus_writer Tff7b72= Te6edf3OggOpusWriterTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__output_pathTb4b4b4, Tff7b72selfTff7b72.Td2a8ff__encoderTb4b4b4)

Te6edf3final_silence_frames Tff7b72= T79c0ff10
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72or Te6edf3final_silence_frames Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3frames_ready Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72or Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72== Tff7b72False Tff7b72and Te6edf3final_silence_framesTb4b4b4)
Tff7b72if Te6edf3frames_readyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutput_latency Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4)Tff7b72*Tff7b72selfTff7b72.Td2a8ffframe_time
Tff7b72selfTff7b72.Td2a8ffmax_latency Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuffer_max_heightTff7b72*Tff7b72selfTff7b72.Td2a8ffframe_time
Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4: Te6edf3frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3final_silence_frames Tff7b72-Tff7b72= T79c0ff1
Te6edf3frame Tff7b72= Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72> Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4: Te6edf3frame Tff7b72= Te6edf3frameTb4b4b4[Tb4b4b4:Tb4b4b4, T79c0ff0Tb4b4b4:Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]
Tff7b72elif Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72< Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72- Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3frame Tff7b72= Te6edf3npTff7b72.Td2a8ffhstackTb4b4b4(Tb4b4b4[Te6edf3frameTb4b4b4, Te6edf3frameTb4b4b4[Tb4b4b4:Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4]Tb4b4b4)

Tff7b72if Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72< Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInsufficient frame data, padding with silenceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3silence_frame Tff7b72= Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTff7b72-Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3frameTff7b72.Td2a8ffdtypeTb4b4b4)
Te6edf3frame Tff7b72= Te6edf3npTff7b72.Td2a8ffvstackTb4b4b4(Tb4b4b4[Te6edf3frameTb4b4b4, Te6edf3silence_frameTb4b4b4]Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffsamples_written Tff7b72+Tff7b72= Te6edf3frameTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4]

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72!= T79c0ff48000Tb4b4b4:
Te6edf3frame Tff7b72= Te6edf3resampleTb4b4b4(Te6edf3frameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbitdepthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4, Tff7b72selfTff7b72.Td2a8ffoutput_samplerateTb4b4b4)

Te6edf3input_samples Tff7b72= Te6edf3frameTff7b72*Tff7b72selfTff7b72.Td2a8ffTYPE_MAP_FACTOR
Te6edf3input_samples Tff7b72= Te6edf3input_samplesTff7b72.Td2a8ffastypeTb4b4b4(Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff__opus_writerTff7b72.Td2a8ffwriteTb4b4b4(Tffa657bytearrayTb4b4b4(Te6edf3input_samplesTff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffbuffer_max_heightTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBuffer lag on Tffd700{Tff7b72selfTffd700}Ta5d6ff (height Tffd700{Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_dequeTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffunderrun_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*T79c0ff0.1Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff__finalized Tff7b72= Tff7b72True


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────